package com.itheima.polymorphsm3;

import com.itheima.polymorphsm3.Animal;
import com.itheima.polymorphsm3.Tortoise;
import com.itheima.polymorphsm3.Wolf;

public class Test {
    public static void main(String[] args) {
        //目标:认识多态代码
        //1.多态的好处1:右边对象是解耦合(随时可换)
        Animal a1=new Tortoise();       //右边是狼或乌龟都行
        a1.run();
        //a1.shinkHead();   报错,多态下不能调用子类特有的功能
                            //编译看左边,Animal里没shinkHead

        Animal a2=new Wolf();
        a2.run();

        //强制类型转换
        //方法:编译看左边,a1是动物,强转成Tortoise或者Wolf都不报错
        Tortoise t1= (Tortoise) a1;     //强转快捷键:alt+回车+回车
        t1.shrinkHead();

        //但是运行看右边,a1指向的是Tortoise,那么就不能强转成Wolf
        //Wolf w1= (Wolf) a1;       报错ClassCastException

        //强制转换前,应该判断对象的真实类型,再进行强制类型转换
        if(a1 instanceof Wolf){     //如果a1指向的是Wolf,那么就是true,强转成狼
            Wolf w1= (Wolf) a1;
            w1.eatSheep();
        }else if (a1 instanceof Tortoise){
            Tortoise t11= (Tortoise) a1;    //a1指向的是Tortoise,强转成乌龟
            t11.run();
        }

        System.out.println("------------------------------------------------");

        //多态好处2:父类类型的变量作为参数(Animal),可以接收一切子类对象(Wolf,Tortoise)
        Wolf w=new Wolf();
        go(w);

//        Tortoise t=new Tortoise();
//        go(t);

    }

    //宠物游戏:所有动物都可以选择这个方法开始跑步
    public static void go(Animal a){        //这里面就不好区分传的是狼还是乌龟了,得先判断
        System.out.println("----------开始----------");
        a.run();

        //强制转换前,应该判断对象的真实类型,再进行强制类型转换
        if(a instanceof Wolf){
            Wolf w= (Wolf) a;
            w.eatSheep();
        }else if (a instanceof Tortoise){
            Tortoise t= (Tortoise) a;
            t.shrinkHead();
        }
    }
}
